AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[Fmx] iOS LongTap rauswerfen

Ein Thema von Rollo62 · begonnen am 30. Mär 2016 · letzter Beitrag vom 30. Mär 2016
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
4.094 Beiträge
 
Delphi 12 Athens
 
#1

[Fmx] iOS LongTap rauswerfen

  Alt 30. Mär 2016, 12:12
Hallo zusammen,

ich kämpfe jetzt seit Wochen (Monaten) mit iOS und dem LongTap GestureRecognizer.

Ich möchte einfach auf einer Fläche mit dem Finger zeichen, und das auch wenn man mal zum Anfang etwas länger
gedrückt hält.
Dazu benutze ich die MouseDown, MouseMove, MouseUp wie ich es unter Win auch machen würde.
Diese werden von TouchesBegan, TouchesMoved, TouchesCancelled und TochesEnd abgeleitet.

Es passiert aber Folgendes:
- nach ca. 0.5 Sek. wird wohl der LongTap erkannt,
dieser sorgt dafür das TouchesCancelled feuert,
das sgt dafür das MouseUp gefeuert wird,
danach ist MouseMove und der ganze Zyklus beendet, weil LongTap ein permanenter Event ist der die Maus hält
==> Resultat: Kein Tap und Draw möglich wenn man mit LongTap beginnt
- starte ich mit dem Finger und bewege mich direkt, dann ist alles so wie gewollt, LongTap kommt nie.

Ich habe jetzt schon zig Versuche gemacht diese dämliche TochesCancelled Problematik loszuwerden, ohne Erfolg.

Was jetzt geholfen hat ist etwas brutal:
- ich werfe in FMX.Platform.iOS den AddGestureRecognizer(LongTap) komplett raus.
Delphi-Quellcode:
procedure TFMXViewBase.AddRecognizer(const Gesture: TInteractiveGesture);
var
  TwoFingerTapRecognizer: UITapGestureRecognizer;
  RotateRecognizer: UIRotationGestureRecognizer;
  ZoomRecognizer: UIPinchGestureRecognizer;
  PanRecognizer: UIPanGestureRecognizer;
  LongTapRecognizer: UILongPressGestureRecognizer;
begin
  case Gesture of
    TInteractiveGesture.Zoom:
      begin
        ZoomRecognizer := TUIPinchGestureRecognizer.Alloc;
        ZoomRecognizer := TUIPinchGestureRecognizer.Wrap(ZoomRecognizer.initWithTarget(GetObjectID, sel_getUid('HandleZoom:')));
        ZoomRecognizer.setDelaysTouchesBegan(False);
        ZoomRecognizer.setCancelsTouchesInView(True);
        ZoomRecognizer.setDelegate(GetObjectID);
        UIView(Super).addGestureRecognizer(ZoomRecognizer);
        ZoomRecognizer.release;
      end;
    TInteractiveGesture.Rotate:
      begin
        RotateRecognizer := TUIRotationGestureRecognizer.Alloc;
        RotateRecognizer := TUIRotationGestureRecognizer.Wrap(RotateRecognizer.initWithTarget(GetObjectID, sel_getUid('HandleRotate:')));
        RotateRecognizer.setDelaysTouchesBegan(False);
        RotateRecognizer.setCancelsTouchesInView(True);
        RotateRecognizer.setDelegate(GetObjectID);
        UIView(Super).addGestureRecognizer(RotateRecognizer);
        RotateRecognizer.release;
      end;
    TInteractiveGesture.Pan:
      begin
        PanRecognizer := TUIPanGestureRecognizer.Alloc;
        PanRecognizer := TUIPanGestureRecognizer.Wrap(PanRecognizer.initWithTarget(GetObjectID, sel_getUid('HandlePan:')));
        PanRecognizer.setMinimumNumberOfTouches(1);
        PanRecognizer.setMaximumNumberOfTouches(2);
        PanRecognizer.setDelaysTouchesBegan(False);
        PanRecognizer.setCancelsTouchesInView(False);
        PanRecognizer.setDelegate(GetObjectID);
        UIView(Super).addGestureRecognizer(PanRecognizer);
        PanRecognizer.release;
      end;
    TInteractiveGesture.TwoFingerTap:
      begin
        TwoFingerTapRecognizer := TUITapGestureRecognizer.Alloc;
        TwoFingerTapRecognizer := TUITapGestureRecognizer.Wrap(TwoFingerTapRecognizer.initWithTarget(GetObjectID, sel_getUid('HandleTwoFingerTap:')));
        TwoFingerTapRecognizer.setNumberOfTapsRequired(1);
        TwoFingerTapRecognizer.setNumberOfTouchesRequired(2);
        TwoFingerTapRecognizer.setDelaysTouchesBegan(False);
        TwoFingerTapRecognizer.setCancelsTouchesInView(True);
        TwoFingerTapRecognizer.setDelegate(GetObjectID);
        UIView(Super).addGestureRecognizer(TwoFingerTapRecognizer);
        TwoFingerTapRecognizer.release;
      end;
    TInteractiveGesture.LongTap:
      begin
        //S4: OFF, to avoid MouseUp
        //TODO: Better to remove the Recognizer only for the desired view, not globally
// LongTapRecognizer := TUILongPressGestureRecognizer.Alloc;
// LongTapRecognizer := TUILongPressGestureRecognizer.Wrap(LongTapRecognizer.initWithTarget(GetObjectID, sel_getUid('LongTap:')));
// LongTapRecognizer.setDelaysTouchesBegan(False);
// LongTapRecognizer.setCancelsTouchesInView(True);
// LongTapRecognizer.setDelegate(GetObjectID);
// UIView(Super).addGestureRecognizer(LongTapRecognizer);
// LongTapRecognizer.release;
      end;
  end;
end;
Das funktioniert zum Glück, auch weil ich sonst nirgendwo den LongTap benötige.

Aber das kann ja wohl nicht im Sinne des Erfinders sein, ich habe noch andere Ideen, wie
- der Form mit RemoveRecognizer den Handler wieder entziehen (ging aber nicht mit dem PlatformServices)
- die LongTap Zeit separat auf 0 oder 99999 setzen (aber wo kann ich darauf zugreifen, wenn nicht global)

Hat schon jemand dieses Problem gehabt, und gibt es andere Workarounds dafür ?

Rollo
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#2

AW: [Fmx] iOS LongTap rauswerfen

  Alt 30. Mär 2016, 12:46
Das ist interessant.
Wäre an einem Kommentar von einem der MA des Herstellers interessiert.

Ansonsten einfach regelmäßig patchen bei jeder neuen Version.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.094 Beiträge
 
Delphi 12 Athens
 
#3

AW: [Fmx] iOS LongTap rauswerfen

  Alt 30. Mär 2016, 14:23
Das ist kein Bug von Apple.
In vielen Foren wird auf so ein Verhalten hingewiesen.
Das scheint normal zu sein.
Bei iOS wird wohl der LongTap Event dann benutzt wie MouseMove, und genau da hakt es anscheinend.

Das liegt wohl eher in der Implementierung von Emba, die dann die TouchesXxxxx umzusetzen versuchen
in normale Mouse Events.
Das ist nicht ganz trivial, und da steckt wohl irgendwo der Wurm drin.

Aber es sollte zumindest einen empfohlenen Workaround geben wie man damit umgehen sollte.
Vielleicht kann man die GestureRecognizer ja irgenwo gezielt disabeln, so etwas in der Art ?

Rollo
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz